Tutorial do crackme 2.0 by _sid written by asasm


Crackme to zasadniczo nie jest jakie skomplikowane, wic podejrzewam e nie zostao rozwizane z powodu nadmiaru metod anty-patch i antydebuggingowych. Koncepcja dzialania Crackme opiera na wasnych proceduracj obsugi komunikatw. Tak wic kady klawisz, a takze kada procedura (np sprawdzanie poprawnoci, czy wyswietlenie komunikatu powoduje wysanie SendMessageA z odpowiednimi parametrami, ktore zostaj obsuzone w zupenie innym miejscu programu. Tutaj dziekuj McCrackerowi, ktry przy okazji rozwiazywania przeze mnie crackmesa zbudowanego na podobnej zasadzie, napisal mi wyjasnienie na temat tego rodzaju koncepcji. Wracajc do crackmesa. Jest napakowany checkami antypatchowymi, wic zupenie nie ma sensu go rozpakowywa (chyba tylko po to eby go przeanalizowa w Idzie). Rozpakowany program i tak sam si terminuje a patchowany w jednym miejscu sprawdza kod patchujac w innym. Za duzo z tym roboty i to zupenie niepotrzebnej. Druga sprawa dotyczy breakpointw. W miejscach waznych dla programu (funkcje API, sprawdzanie poprawnosci hasa) ich obecnosc jest wykrywana i program sie konczy. Do tego wszystkiego dochodzi mnostwo junk code'u. Wobec tego najlepiej jest :uruchomic cma w Ollym, stawiac w newralgicznych punktach hardware bp, a nie 0CCh, a junk analizowa pluginem Analyse This, ktry akurat w tym przypadku doskonale go izoluje i uwalnia od patchowania kodu.
Pierwszym zabezpieczeniem jest wpisanie odpowiedniego kodu z panelu liczbowego.
Kady klawisz to osobny komunikat np:

46 loc_402A46:                             ; CODE XREF: .text:00402A42j
.text:00402A46                 push    0
.text:00402A48                 push    1  <-----------nacisnieta jedynka
.text:00402A4A                 push    1F41h  <----------------komunikat
.text:00402A4F                 push    dword ptr [ebp+8]
.text:00402A52                 call    SendMessageA
.text:00402A57                 jmp     short loc_402A5C

itd.
Po nacisnieciu "#", czyli akceptuj.Najpierw wykonuje si fake check, na ktry oczywicie te si nabraem.

Prawdziwa procedura zaczyna sie w :

00401333  JMP SHORT Crackme2.00401338

Procedure oczyszczon z junkw zaczam w rdle brute force'a

Procedura konczy si komunikatem

.text:0040159E                 push    0               ; lParam
.text:004015A0                 push    0               ; wParam
.text:004015A2                 push    1E62h           ; Msg
.text:004015A7                 push    [ebp+hWnd]      ; hWnd
.text:004015AA                 call    SendMessageA

Natmiast w obsudze tego komunikatu sprawdzana jest poprawna warto

t:00402397                 	cmp     eax, 1313394Dh
.text:0040239C                 jnz     short loc_4023D1
.text:0040239E                 jmp     short loc_4023A4

Kilka poprawnych kodow to:59505,59475,59495,550334,748334,754534,748534,754634,748634
eby uzyskac wiecej wystarczy skompilowac rdo bruta.

Po wpisaniu poprawnego kodu uaktywniaja sie okienka od keygena.

Name i serial pobierany jest przez GetDlgItemTextA. Najpierw mieszany jest name, potem jesli wszystko ok wysyamy Message 2329,

00401CD4   > 817D 0C 292300>CMP DWORD PTR SS:[EBP+C],2329

Teraz sprawdzane jest to z serialem jesli ok wysylany jest message 232A, a potem 2397, ktry uaktywnia klawisz last password.
Procedurki nie zgebiem i nie opisuje, bo niechccy stwierdziem e dla name:"asa","as","a","asm" dziaa  serial:"4" lub "6".

Teraz ostatni password. W okienku dialogowym wpisujemy pass, ktry pobierany jest GetDlgItemTextA najpierw nastepuje kilka nic nie znaczacych operacji.Wasciwa procedura zaczyna sie od:

.text:004033E0                 mov     al, ds:byte_405911[ecx]
.text:004033E6                 jmp     short loc_4033EA

Ponownie oszyszczona procedure pozostawaim w pliku last_pass.asm do kompilacji brute force'a moze on miec dowolna iloc znakw bo ju dla dwch speniona jest warunek.
Najwaniejsze, aby po wykonaniu ponizszych instrukcji w bl byo 0BBh, bo tylko z ta wartoci xorowany jest text poprawnego MessageBoxA. Inaczej zobaczymy jakie krzaczki.



text:0040348A                 shr     bx, 8
.text:0040348E                 jmp     short loc_403492
.text:0040348E ; 
.text:00403490                 db 0CCh, 9Ah
.text:00403492 ; 
.text:00403492 
.text:00403492 loc_403492:                             ; CODE XREF: sub_403164+32Aj
.text:00403492                 add     bl, 42h
.text:00403495                 jmp     short loc_403499


 

Przykladowe kody : 2&,153000000,337100000,537100000,637100000.
A poprawny komunikat jest wywietlany tutaj.



004056AA   5F               POP EDI
004056AB   81C7 35000000    ADD EDI,35
004056B1   5B               POP EBX
004056B2   881F             MOV BYTE PTR DS:[EDI],BL
004056B4   33C9             XOR ECX,ECX
004056B6   8A1F             MOV BL,BYTE PTR DS:[EDI]
004056B8   5A               POP EDX
004056B9   803C11 00        CMP BYTE PTR DS:[ECX+EDX],0
004056BD   74 0F            JE SHORT Crackme2.004056CE
004056BF   301C11           XOR BYTE PTR DS:[ECX+EDX],BL
004056C2   41               INC ECX
004056C3   FEC3             INC BL
004056C5   80FB F0          CMP BL,0F0
004056C8   7C 02            JL SHORT Crackme2.004056CC
004056CA   8A1F             MOV BL,BYTE PTR DS:[EDI]
004056CC  ^EB EB            JMP SHORT Crackme2.004056B9
004056CE   FE47 01          INC BYTE PTR DS:[EDI+1]
004056D1   807F 01 03       CMP BYTE PTR DS:[EDI+1],3
004056D5  ^75 DD            JNZ SHORT Crackme2.004056B4
004056D7   58               POP EAX
004056D8   FFD0             CALL EAX <---------MessageBoxA


I to by byo na tyle...



Cracked by asasm.








